%% @author jovial

-module(controle_vida).
-export([analisarMortes/5, analisarNascimentos/5]).

%% ====================================================================
%% API functions
%% ====================================================================

analisarMortes(MapaPresas, MapaPredadores, Terreno, Criatura, Posicao) -> 
	Posicoes = terreno:obterPosicoesValidas(Posicao),
	{Morreu, ListaAtualizacao} = analisarMorte(MapaPresas, MapaPredadores, Terreno, Posicoes, Criatura),
	if not Morreu ->
		   MorteNatural = criatura:morreuCausasNaturais(Criatura),
		   if MorteNatural ->
				  [{morreu, Criatura, undefined}|ListaAtualizacao];
			  true ->
				  ListaAtualizacao
		   end;
	   true ->
		   ListaAtualizacao
	end.

analisarMorte(MapaPresas, MapaPredadores, Terreno, [Posicao|T], Criatura) ->
	Criatura2 = getCriatura(MapaPresas, MapaPredadores, Terreno, Posicao),
	if Criatura2 =/= undefined ->
		PodeComer1 = criatura:podeComer(Criatura, Criatura2),
		PodeComer2 = criatura:podeComer(Criatura2, Criatura),
		if PodeComer1 ->
				Nova_Criatura = criatura:comeu(Criatura),
				{false, [{atualizar, Nova_Criatura, undefined}, {morreu, Criatura2, undefined}]};
		   PodeComer2 ->
			   	Nova_Criatura = criatura:comeu(Criatura2),
				{true, [{atualizar, Nova_Criatura, undefined}, {morreu, Criatura, undefined}]};
		   true ->
			   	analisarMorte(MapaPresas, MapaPredadores, Terreno, T, Criatura)
		end;
	true ->
		analisarMorte(MapaPresas, MapaPredadores, Terreno, T, Criatura)
	end;
analisarMorte(_, _, _, [], _) ->
	{false, []}.


analisarNascimentos(MapaPresas, MapaPredadores, Terreno, Criatura, Posicao) -> 
	Posicoes = terreno:obterPosicoesValidas(Posicao),
	analisarNascimento(MapaPresas, MapaPredadores, Terreno, Posicoes, Criatura).

analisarNascimento(MapaPresas, MapaPredadores, Terreno, [Posicao|T], Criatura) ->
	Criatura2 = getCriatura(MapaPresas, MapaPredadores, Terreno, Posicao),
	if Criatura2 =/= undefined ->
		PodeProcriar = criatura:podeProcriar(Criatura, Criatura2),
		if PodeProcriar ->
			   Nova_Criatura = criatura:procriou(Criatura),
			   Nova_Criatura2 = criatura:procriou(Criatura2),
			   RecemNascido = criatura:new(criatura:getTipo(Nova_Criatura)),
			   [{nasceu, RecemNascido, Posicao}, {atualizar, Nova_Criatura, undefined}, {atualizar, Nova_Criatura2, undefined}];
		   true ->
			   analisarNascimento(MapaPresas, MapaPredadores, Terreno, T, Criatura)
		end;
	true ->
		analisarNascimento(MapaPresas, MapaPredadores, Terreno, T, Criatura)
	end;
analisarNascimento(_, _, _, [], _) ->
	[].

getCriatura(MapaPresas, MapaPredadores, Terreno, {X, Y}) -> 
	ID_Criatura = array:get(Y, array:get(X, Terreno)),
	if ID_Criatura =/= undefined ->
		   {_, Tipo} = ID_Criatura,
		   if Tipo =:= presa ->
				  [Criatura] = dict:fetch(ID_Criatura, MapaPresas),
				  Criatura;
			  true ->
				  [Criatura] = dict:fetch(ID_Criatura, MapaPredadores),
				  Criatura
		   end;
	   true ->
		   undefined
	end.